#pragma once

#include "ConductorPrueba.h"
#include "ISistema.h"
#include "Prueba.h"
#include "Puntero.h"
#include "IRecurso.h"

class CasoDePrueba : public Prueba
{
public:
	CasoDePrueba();
	virtual ~CasoDePrueba();

protected:
	virtual void CorrerPruebaConcreta();
	virtual Cadena GetNombre() const;

private:
	Puntero<ISistema> interfaz;
	bool verificarTipoRetorno;
	int max_Paises;
	int max_Ciudades;
	int max_Recursos;

	template <class T>
	void Verificar(Puntero<Iterador<Puntero<T>>> obtenidos, Puntero<Iterador<Puntero<T>>> esperados, Cadena comentarioFalta, Cadena comentarioSobra);

	void Verificar(pPais obtenido, pPais esperado, Cadena comentario = "Se obtuvo el pais {0} y se esperaba {1}");
	void Verificar(pCiudad obtenido, pCiudad esperado, Cadena comentario = "Se obtuvo la ciudad {0} y se esperaba {1}");
	void VerificarRecurso(Puntero<Iterador<Puntero<IRecurso>>> obtenido, Puntero<Iterador<Puntero<IRecurso>>> esperado);
	void Verificar(pRecurso obtenido, pRecurso esperado, Cadena comentario);
	void VerificarTupla(Puntero<Iterador<Tupla<pPais, pCiudad>>> obtenido,Puntero<Iterador<Tupla<pPais, pCiudad>>> esperado);

	void Verificar(TipoRetorno retorno, TipoRetorno retornoEsperado, Cadena comentario);

	void InicializarSistema();
	void InicializarMapa(bool verificar);
	void InicializarPaises(bool ver);
	void InicializarCiudades(bool ver);
	void InicilizarRecursos(bool ver);

	void PruebaEjemplo();

	void PruebaOK1();
	void PruebaOK2();
	void PruebaOK3();
	void PruebaOK4();
	void PruebaOK5();
	void PruebaOK6();
	void PruebaOK7();
	void PruebaOK8();
	void PruebaOK9();
	void PruebaOK10();
	void PruebaOK11();
	
	void PruebaERROR1();
	void PruebaERROR2();
	void PruebaERROR3();
	void PruebaERROR4();
	void PruebaERROR5();
	void PruebaERROR6();
	void PruebaERROR7();
	void PruebaERROR8();
	void PruebaERROR9();
	void PruebaERROR10();
	void PruebaERROR11();	
};